일반적으로 CLI tool은 아래처럼 뭔가 입력받는다.
grrs foobar test.txt
main
에 아래 코드를 넣으면 첫번째 두번째 인자 받아옴.
let pattern = std::env::args().nth(1).expect("no pattern given");
let path = std::env::args().nth(2).expect("no path given");
이렇게하면 string으로만 받으니까, 각 인자를 type으로 여기는게 낫다.
struct Cli {
pattern: String,
path: std::path::PathBuf,
}
PathBuf
는 String과 비슷한데 크로스플랫폼 파일시스템 경로용도로 사용됨
아래처럼 옵션 이름을 주고 파싱시키려면?
--pattern "foo"
--pattern="foo"
--help
유명한 라이브러리 clap 를 사용한다.
Cargo.toml
파일 [dependencies]
아래 다음을 넣어서 의존성 추가하기
clap = { version = "3.0", features = ["derive"] }
아래 처럼 trait사용추가. clap에는 다양한 옵션이 있음
#![allow(unused)] // 이건 그냥 경고문구 없애려고 추가함
use clap::Parser;
#[derive(Parser)]
struct Cli {
pattern: String,
#[clap(parse(from_os_str))]
path: std::path::PathBuf,
}
// #[clap(short = 'o', long = "output")] 이런식으로 지정도 가능
그리고 main
에 다 지우고 이걸 추가한다.
let args = Cli::parse();
// 실패해도 clap이 자동으로 help 메세지도 만들어줌
// parse 메소드는 main에서만 사용할 것
확인은 cargo run
인자를 넘기려면 cargo run -- some-pattern some-file
이렇게 할 수 있고, 자동 help 메세지를 띄워보면 cargo run -- --help
아래처럼 인자에 대한 정보가 나온다.
grrs
USAGE:
grrs <PATTERN> <PATH>
ARGS:
<PATTERN>
<PATH>
OPTIONS:
-h, --help Print help information
[[Rust - CLI implement grep like function]]